﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>2.2 DoitPHP的Model应用</title>
<link href="images/main.css" rel="stylesheet" type="text/css" />
<meta name="Keywords" content="Doitphp DoitPHP手册 DoitPHP教程" />
<meta name="description" content="Doitphp DoitPHP手册 DoitPHP教程" />
</head>

<body>
<div class="total">
<!-- 标头-->
<div class="top">打造简单、易用、易于扩展的PHP轻量级框架</div>
<!-- content -->
<div class="content">
<div class="h1">2.2 DoitPHP的Model应用</div>
<!-- 文字说明 -->
<div class="text">
<p>模型(Model)是 MVC里的M，模型用于操作数据以及数据相关的业务规则。</p>
	<div class="note">注：DoitPHP目前支持的数据库有:mysql、oracle、postgresql、sqlite、mssql、mongodb。如外DoitPHP提供了PDO数据库驱动支持，利用PDO可以操作更多的数据库(关系型数据库)。由于mongodb属于NOSQL的范筹，所以Model的函数对mongodb操作无效，如用mongodb需用扩展类mongodb来实现。如需<span>mysql主从数据库</span>的支持,实现数据的读写分离,您需要下载DoitPHP的mysql专业版, 或者去DoitPHP官方论坛下载支持mysql主从数据库的Model基类文件将其替换掉标准版的基类文件即可支持Mysql主从数据库。之所以DoitPHP标准版不支持mysql主从分离，是因为标准版支持的数据库种类较多,出于兼容性和运行效率的考滤。对于mysql主从数据库的应用,<a href="6.4.html">后面内容</a>还会讲到。</div>
	
	<h1>一、创建模型</h1>
	<p>在项目目录models中新建Model文件(具体如何操作，前面介绍<a href="1.3.html" target="_self">DoitPHP Tools使用说明</a>时，已经详细讲述过了)。例如：要建PostModel.class.php文件(注：Model文件中所有的类必须继承Model基类，原因很简单，Model基类中已经封装了N多种数据库操作函数，如果不继承，怎么使用这些有用的函数呢？)。</p>
	<p><img src="images/1-1-A-14.jpg" /></p>
<div style="margin-left:20px;">Model文件创建好后，怎么在Controller文件中调用呢？<br/>
首先对model进行实例化<br/>
$model = $this->model('post');<br/>
<br/>
如果查询post数据表的所有数据，操作如下：<br/>
$data = $model->findAll();<br/>
如果要查看$data的数据，则：<br/>
$this->dump($data);<br/>
<br/>
上面的例子，用到函数：findAll()，这就是在Model类中封装的函数。下面将Model基类所提供的函数及使用说明详细地讲述一下：</div>
<h1>二、Model 类所提供的函数及说明。</h1>

<p>Model类提供的函数其数目比较多，为了讲述的更加有条理，在此将分为以下几部分讲述。</p>
<h2>第一部分：组装SQL语句的操作函数。</h2>

<div style="margin-left:20px;">1、<strong>from($tabs, $fields)</strong><br/>
实现SQL语句中：“select `数据表字段` from 数据表 ”部分的处理。<br/>
参数说明：<br/>
$tabs为所要查询的数据表。如果所要查询的数据表为多个(大于1个)，参数要为数组。如：array(''数据表1, '数据表2', ...) ;注：当参数为空时,数据表则默认为当前model所对应的数据表<br/>
$fields 为所要查询的数据表字段。默认为“*”，即当此参数为null时，则视为查询数据表所有的字段。如果查询字段为多个，参数要为数组类型。如：array('字段1', '字段2');</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->from('post');<br/>
echo $model;<br/>
SQL语句为：select * from post<br/>
<br/>
例二、<br/>
$model->from('post', array('title', 'content'));<br/>
echo $model;<br/>
显示SQL语句为：SELECT `title`, `content` FROM `post`<br/>
<br/>
例三、<br/>
$model->from(array('post', 'user'), array('title', 'username'));<br/>
echo $model;<br/>
显示SQL语句为：SELECT `title`, `username` FROM `post`, `user`<br/>
<br/>
例四、<br/>
$model->from(array('p'=>'post', 'u'=>'user'), array('p.title', 'u.username'));<br/>
echo $model;<br/>
显示SQL语句为：<br/>
SELECT `p`.`title`, `u`.`username` FROM `post` AS `p`, `user` AS `u`<br/>
注：array('p'=>'post', 'u'=>'user')，这里数组索引为非数字时，则代表SQL语句中的ALIAS(更名)情况。当然，字段参数也支持更名。如下面的例子：<br/>
<br/>
例五、<br/>
$model->from(array('p'=>'post', 'u'=>'user'), array('name'=>'p.title', 'u.username'));<br/>
echo $model;<br/>
显示SQL语句为：SELECT `p`.`title` AS `name`, `u`.`username` FROM `post` AS `p`, `user` AS `u`<br/>
<br/>
例六、<br/>
对常用SQL函数的支持。<br/>
<br/>
(1)、函数count()<br/>
$model->from('post', array('total_num'=>'count(`id`)'));<br/>
显示SQL语句为：SELECT count(`id`) AS `total_num` FROM `post`<br/>
<br/>
(2)、函数avg()<br/>
$model->from('post', array('avg_num'=>'avg(`id`)'));<br/>
显示SQL语句为：SELECT avg(`id`) AS `avg_num` FROM `post`<br/>
<br/>
(3)、函数sum()<br/>
$model->from('post', array('num'=>'sum(`id`)'));<br/>
显示SQL语句为：SELECT sum(`id`) AS `num` FROM `post`<br/>
<br/>
(4)、函数max()<br/>
$model->from('post', array('num'=>'max(`id`)'));<br/>
显示SQL语句为：SELECT max(`id`) AS `num` FROM `post`<br/>
<br/>
(5)、函数min()<br/>
$model->from('post', array('num'=>'min(`id`)'));<br/>
显示SQL语句为：SELECT min(`id`) AS `num` FROM `post`<br/>
<br/>
(6)、函数distinct()<br/>
$model->from('post', 'distinct `id`');<br/>
显示SQL语句为：SELECT distinct `id` FROM `post`</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">2、<strong>where($where,  $value)</strong><br/>
用于处理SQL语句中where部分的语句。<br/>
参数说明：<br/>
$where:SQL语句的条件语句，参数非空。<br/>
$value:SQL语句中?的值,参数默认为null。<br/>
注：当SQL语句中有查询的字段值为字符或字符串时，不要忘记将字符或字符串进行转义。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->where('id=23');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `id`=23<br/>
<br/>
例二、<br/>
$model->where('name=?', 'doitphp');<br/>
或<br/>
$model->where('name=\'doitphp\'');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `name`='doitphp'<br/>
<br/>
例三、<br/>
$data = $model->quote_into('doitphp');<br/>
$model->where('name=' . $data);<br/>
echo $model;<br/>
显示SQL语句为：WHERE `name`='doitphp'<br/>
<br/>
例四、<br/>
$model->where('id>6')->where('name=?', 'doitphp');<br/>
或<br/>
$model->where(array('id>6', 'name=?'), 'doitphp');<br/>
或<br/>
$model->where(array('id>6', 'name=\'doitphp\''));<br/>
echo $model;<br/>
显示SQL语句为：WHERE `id`>6 AND `name`='doitphp'<br/>
<br/>
例五、<br/>
$model->where('p.id>6')->where('u.name=?', 'doitphp')->where('p.user_id=u.user_id');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `p`.`id`>6 AND `u`.`name`='doitphp' AND `p`.`user_id`=u.user_id<br/>
<br/>
例六、<br/>
$model->where('id<=100')->where('name like ?', 'doit%');<br/>
echo $model;<br/>
显示SQL语句：WHERE `id`<=100 AND `name` LIKE 'doit%'<br/>
<br/>
例七、<br/>
$model->where(array('name=?', 'group=?'),  'doitphp');<br/>
echo $model;<br/>
显示SQL语句：WHERE `name`='doitphp'  AND  `group`='doitphp'<br/>
<br/>
例八、<br/>
$model->where('id between 10 and 20');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `id` BETWEEN 10 AND 20<br/>
<br/>
例九、<br/>
$model->where('id in(10, 12, 15)');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `id` IN(10, 12, 15)<br/>
<br/>
例十、<br/>
$model->where('match(name, email) against(?)', 'doitphp');<br/>
echo $model;<br/>
显示SQL语句为：WHERE MATCH (name, email) AGAINST ('doitphp')<br/>
注：本例为全文搜索实例，mysql的MYISAM引擎才支持哦，INNODB引擎不支持全文搜索。</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">3、<strong>orwhere($where, $value)</strong><br/>
用于处理SQL语句中orwhere部分的语句。<br/>
参数说明：<br/>
$where:SQL语句的条件语句，参数非空。<br/>
$value:SQL语句中?的值,参数默认为null。<br/>
注：当SQL语句中有查询的字段值为字符或字符串时，不要忘记将字符或字符串进行转义。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->orwhere('id>90')->orwhere('id<100');<br/>
echo $model;<br/>
显示SQL语句为：OR `id`>90 AND `id`<100<br/>
注：本函数在使用上与where()使用函数完全相同，在本函数的使用上要参考下where()的使用方法。前面有详细的说明。<br/>
<br/>
例二、<br/>
$model->where('id>30')->where('id<40')->orwhere('id>90')->orwhere('id<100');<br/>
echo $model;<br/>
显示SQL语句为：WHERE `id`>30 AND `id`<40 OR `id`>90 AND `id`<100<br/>
注：本函数要与where()一块用，即：在出现orwhre()地方一定要出现where()。不过有where()出现的地方，不一定要有orwhere()。Where()和orwhere()没有前后顺序限制。最后无论这两个函数哪一个最先出现，最后系统还是先处理where(),后出理orwhere()。</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">4、<strong>order($order_desc)</strong><br/>
完成SQL语句中order部分语句的处理。<br/>
参数说明：<br/>
$order_desc是oder语句中排序一个单元，参数非空，支持数组。</div>
<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$model->order('id asc'); <br/>
echo $model;<br/>
显示SQL语句为：ORDER BY `id` ASC<br/>
<br/>
例二、<br/>
$model->order('p.id asc')->order('u.name desc'); <br/>
或<br/>
$model->order(array('p.id asc', 'u.name desc')); <br/>
echo $model;<br/>
显示SQL语句为：ORDER BY `p`.`id` ASC , `u`.`name` DESC</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">5、<strong>join($table_name, $where)</strong><br/>
用于处理SQL中left join(左关联)语句的处理。<br/>
参数说明：<br/>
$table_name为关联的数据表名。参数同前面所讲from()的$tabs参数略同，可以进行alias(更名)操作，不过本参数不支持多个数据表。<br/>
$where为关联数据表的条件。</div>
<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$model->from(array('p'=>'post'),'p.post_title')->join(array('u'=>'user'), 'p.user_id=`u`.`user_id`'); <br/>
echo $model;<br/>
显示SQL语句为：SELECT `p`.`post_title` FROM `post` AS `p` LEFT JOIN `user` AS `u` ON `p`.`user_id`=`u`.`user_id`</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">6、<strong>group($group_name)</strong><br/>
用于完成SQL中group by 语句处理。<br/>
参数说明：<br/>
$group_name是分组名称。</div>
<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$model->group('name'); <br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `name`<br/>
<br/>
例二、<br/>
$model->group('name')->group('class'); <br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `name`, `class`<br/>
<br/>
例三、<br/>
$model->group('p.name')->group('u.class');<br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `p`.`name`, `u`.`class`</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">7、<strong>having($where, $value)</strong><br/>
用于完成SQL语句中having部分的处理。注：本函数一般与group()同用。having的SQL语句用于“限制”group语句的，一般出现在group之后。<br/>
参数说明：<br/>
$where为条件语句，与where()中参数相同。可以参考where()来理解。<br/>
$value为SQL语句中?的值,参数默认为null。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->group('name')->having('coun(`name`)>2'); <br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `name` HAVING coun(`name`)>2<br/>
<br/>
例二、<br/>
$model->group('name')->having('coun(`name`)>2')->having('coun(`name`)<6'); <br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `name` HAVING coun(`name`)>2 AND coun(`name`)<6<br/>
<br/>
例三、<br/>
$model->group('team')->having('team_name=?', 'doitphp');<br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `team` HAVING team_name='doitphp'</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">8、<strong>orhaving($where, $value)</strong><br/>
用于完成SQL语句中orhaving部分的处理。注：本函数一般与having()同用。<br/>
参数说明：<br/>
$where为条件语句，与where()中参数相同。可以参考having()来理解。<br/>
$value为SQL语句中?的值,参数默认为null。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->group('name')->having('coun(`name`)>2')->orhaving('coun(`name`)<6');<br/>
echo $model;<br/>
显示SQL语句为：GROUP BY `name` HAVING coun(`name`)>2 or coun(`name`)<6</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">9、<strong>limit($num1, $num2)</strong><br/>
用于完成SQL语句的limit部分的处理。<br/>
参数说明：<br/>
$num1, 即SQL中limit 后的第一个数字，用于定义查询显示的起始值。<br/>
$num2, 即SQL中limit 后的第二个数字，用于定义查询显示多少行数据。默认为null即:本参数可以为空。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->limit(10); <br/>
echo $model;<br/>
显示SQL语句为：LIMIT 10<br/>
<br/>
例二、<br/>
$model->limit(10, 30); <br/>
echo $model;<br/>
显示SQL语句为：LIMIT 10, 30</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">10、<strong>page_limit($page, $list_num)</strong><br/>
用于完成SQL语句的limit部分的处理，常用于有分页情况下的数据查询。<br/>
参数说明：<br/>
$page：当前的页数。<br/>
$list_num：每页所显示数据的行数。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->page_limit(3, 10); <br/>
echo $model;<br/>
显示SQL语句为：LIMIT 20, 10</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">11、<strong>select($item)</strong><br/>
用于完成from(),where()等函数所生成的SQL片段的组装，组装成一个完整理的SQL查询语句，并将其执行，且返回查询信息。<br/>
参数说明：<br/>
$item为返回数据的选项，当为true时，则select返回的数据是多维组数组，即返回的为SQL查询语句的全部数据。当为false时，为select查询后第一条数据。默认为true。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$data = $model->from('post')->where('id>27')->order('id desc')->limit(10, 20)->select(); <br/>
$this->dump($data);<br/>
显示多行数据(二维数组)。<br/>
<br/>
例二、<br/>
$data = $model->from('post')->where('id>27')->order('id desc')->limit(10, 20)->select(false); <br/>
$this->dump($data);<br/>
显示单行数据(一维数组)。</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">12、<strong>quote_into($value)</strong><br/>
本函数用来完成字符串的转义的。防止SQL注入，提高程序安全。辅助于where(), orwhere(), having()这三个函数。<br/>
参数说明：<br/>
$value：字符串内容。本参数支持数组。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$doit = $model->quote_into(‘doit's book’);<br/>
echo $where;<br/>
显示SQL语句为：'doit\'s book'。(函数运行原理极为简，相当于PHP的addslashes()函数操作)。<br/>
<br/>
例二、<br/>
$name = $model->quote_into('doit'); <br/>
$model->where('name='.$name); <br/>
echo $model;<br/>
显示SQL语句为：WHERE `name`='doit'</div>

<p>&nbsp;</p>
<h2>第二部分：常用的数据库操作函数</h2>
<p>注：这些函数并非面向对象式的数据库操作函数，而是数组型的。</p>
<p>1、主键查询</p>

<div style="margin-left:20px;">(1)、<strong>find($id, $fields = null)</strong><br/>
用于查找并返回主键为$id的数据。(注：此主键并非数据表的PRIMARY_KEY，这个主键是相对的，如果没有自定义，则默认为数据表的PRIMARY_KEY。)<br/>
参数说明：<br/>
$id为主键的ID，由于这个主键可以自定义，所以此参数也可是字符串。当然也可是数组。参数为数组时，相当于SQL语句中 WHERE IN(参数内容)。<br />
$fields：所要查询的数据表字段.默认为全部数据表字段
</div>
<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$data = $model->find(23);<br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$data = $model->find(array(21,23,27)); <br/>
$this->dump($data);<br/>
注：本例参数为数组型，返回的数据为多维数组。<br/>
<br/>
例三、<br/>
$model->primary_key = 'title';<br/>
$data = $model->find('\'my god\'');<br/>
$this->dump($data);<br/>
注：本例为主键自定义实例。自定义操作：在本函数调用之前$model->primary_key = '自定义的主键'；如果参数为字符串，别忘了对参数进行转义(使用quote_into()函数或参数中用\'这种方式)。<br />
<br />
例四、<br/>
$data = $model->find(21, array('name', 'age', 'addr'));<br/>
$this->dump($data);<br/>
<br/>
例五、<br/>
$data = $model->find(array(21,23,27),  array('name',  'age')); <br/>
$this->dump($data);
</div>

<p>&nbsp;</p>
<div style="margin-left:20px;">(2)、<strong>findAll($fields = null, $order_asc = true，$offset = null, $count = null)</strong><br/>
以数据表主键为顺序查询并返回数据表内所有数据。本函数获取数据表全部数据时只适用于数据表数据量不大时。如果数据表的数据是千万级1TB以上。数据全返回，程序运行消耗时间不说，单单服务器内存的占用也是吃不消的，所以在数据表数据量不大时用于调试程序所用(对开发者建议)，要么$offset,$count参数赋上值则相当于SQL中的limit $offset, $count。本函数与find()一样，也支持order及主键的自定义，操作函数与find()相同。对此如不明白，可以参考find()的用法。<br/>
参数说明：<br/>
$fields：所要查询的数据表字段.默认为全部数据表字段<br />
$order_asc：数据排序,若为true时为ASC,为false时为DESC, 默认为ASC<br />
$offset: limit 启起ID<br />
$count:	limit 显示的行数</div>

<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$data = $model->findALL(); <br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$model->primary_key = 'title';<br/>
$data = $model->findALL(); <br/>
$this->dump($data);<br/>
<br/>
例三、<br/>
$data = $model->findALL(array('name', 'tel'), false); <br/>
$this->dump($data);<br /><br />
例四、<br/>
$data = $model->findALL('name', false); <br/>
$this->dump($data);
<br/><br />
例五、<br/>
$data = $model->findALL(array('name', 'tel'), false, 5, 10); <br/>
$this->dump($data);<br />
<br/>
例六、<br/>
$data = $model->findALL(array('name', 'tel'), false, 10); <br/>
$this->dump($data);<br />
</div>
<p>&nbsp;</p>

<p>2、根据一个查询条件，获取数据</p>
<div style="margin-left:20px;">(1)、<strong>getOne($where, $value = null, $fields = null)</strong><br/>
查询并获取满足$where条件的第一行数据。<br/>
参数说明：<br/>
$where:查询条件，参数类似于where()函数。如果参数里有字符串，不要忘记对其进行转义。参数非空，支持数组。<br/>
$value:默认为null, 是查询条件中?的替换数据。具体使用，请参考前面所讲的where()的使用方法<br />
$fields：所要查询的数据表字段.默认为全部数据表字段
</div>

<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$data = $model->getOne('title=\'my god\''); <br/>
或<br/>
$data = $model->getOne('title=?', 'my god');<br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$where = $model->quote_into( 'my god');<br/>
$data = $model->getOne('title='.$where); <br/>
$this->dump($data);<br/>
<br/>
例三、<br/>
$data = $model->getOne(array('id'>13, 'name=?'), 'doitphp');<br/>
$this->dump($data);<br /><br />
例四、<br />
$data = $model->getOne('name=?', 'doitphp', array('info', 'group'));<br />
$this->dump($data);<br /><br />	
例五、<br />
$data = $model->getOne('name=?', 'doitphp', 'info');<br />
$this->dump($data);</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">(2)、<strong>getAll($where, $value=null, $fields = null, $order = null, $offset = null, $count = null)</strong><br/>
查询并获取满足$where条件的所有数据。<br/>
参数说明：<br/>
$where是查询条件，参数类似于where()函数的。如果参数里有字符串，不要忘记对其进行转义。参数非空，支持数组<br/>
$value是查询条件中?的替换数据，默认为null。<br/>
$fields：所要查询的数据表字段.默认为全部数据表字段
<br />
$order是数据显示的排序条件，默认为null。<br />
$offset: limit 启起ID<br />
$count:	limit 显示的行数</div>

<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$data = $model->getAll('title=?', 'my god');<br/>
或<br/>
$data = $model->getAll('title=\'my god\''); <br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$where = $model->quote_into('my god');<br/>
$data = $model->getAll('title='.$where); <br/>
$this->dump($data);<br/>
<br/>
例三、<br/>
$data = $model->getAll(array('post_id>23', 'title=?'), 'doitphp', null, 'post desc'); <br/>
$this->dump($data);<br /><br />
例四、<br/>
$data = $model->getAll(array('post_id>23', 'title=?'), 'doitphp', array('desc', 'author')); <br/>
$this->dump($data);<br />
<br/>
例五、<br/>
$data = $model->getAll(array('post_id>23', 'title=?'), 'doitphp', null, 'post desc', 5, 10); <br/>
$this->dump($data);<br />
<br/>
例六、<br/>
$data = $model->getAll(array('post_id>23', 'title=?'), 'doitphp', null, 'post desc', 10); <br/>
$this->dump($data);
</div>

<p>&nbsp;</p>

<div style="margin-left:20px;">(3)、<strong>count($table_name, $field_name = null, $where = null, $value = null)</strong><br/>
获取某数据表满足一定条件的数据的总行数.注：分页程序常用<br/>
参数说明：<br/>
$table_name:所要查询的数据表名<br/>
$field_name:所要查询字段名称,当参数为null时，系统默认为当前数据表的主键<br/>
$where	   :查询条件<br/>
$value	   :数值（数据表某字段所对应的数据，通常都为字符串或字符）<br/>
</div>
<p>使用举例：</p>
<div style="margin-left:20px;">
例一、<br/>
$total_num = $model->count('posts', 'post_id', 'id>1000');<br/>
<br/>
例二、<br/>
$total_num = $model->count('posts', 'post_id', 'author=?', 'doitphp');<br/>
</div>

<p>&nbsp;</p>

<p>3、对数据表的UID操作(update、insert、delete)</p>
<div style="margin-left:20px;">(1)、<strong>update($data, $where, $params = null)</strong><br/>
对model所对应的数据表进行更改操作。本函数均对所要update的数据进行了addslashes()转义，有效防止SQL注入。<br/>
参数说明：<br/>
$data为所要更改的内容，为数组型。参数数组中数组索引为数据表字段，数组的值为所要写入的内容。如果想更改一行数据，字段1为a, 字段2为b，那参数应为：array('字段1'=>'a', '字段2'=>'b');当参数数组有索引不是数据表中的字段时，程序执行时则对其进行过滤掉，不加利用。<br/>
$where为满足的条件。参数格式与whrer()，getOnet()等函数的参数相同。<br/>
$params为替换$where里?的替换数据,默认为null</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$update_array = array('title'=>'DEMO', 'content'=>'IT IS A DEMO');<br/>
$model->update($update_array, 'id=5');<br/>
<br/>
例二、<br/>
$update_array = array('title'=>'DEMO', 'content'=>'IT IS A DEMO');<br/>
$model->update($update_array, 'name=?', 'tommy');</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">(2)、<strong>insert($data)</strong><br/>
向model所对应的数据表插入一条数据信息。本函数均对所要insert的数据进行了addslashes()转义，有效防止SQL注入。<br/>
参数说明：<br/>
$data为所要写入的数据，数组型。参数数组中数组索引为数据表字段，数组的值为所要写入的内容。如果想写入一行数据，字段1为a, 字段2为b，那参数应为：array('字段1'=>'a', '字段2'=>'b');当参数数组有索引不是数据表中的字段时，程序执行时则对其进行过滤掉，不加利用。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$insert_array = array('title'=>'DEMO', 'content'=>'IT IS A DEMO');<br/>
$model->insert($insert_array);</div>
<p>&nbsp;</p>

<div style="margin-left:20px;">(3)、<strong>delete($where, $value = null)</strong><br/>
从model所对应的数据表中删除满足参数条件的数据。<br/>
参数说明：<br/>
$where为删除数据的条件，参数格式，参考where()的参数。同样如果参数中有字符，不应忘记对其转义。<br/>
$value为删除数据的条件中?的替换数据，默认为null。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->delete('id=5');<br/>
<br/>
例二、<br/>
$where = $model->quote_into('tommy');<br/>
$model->delete('name='.$where);<br/>
<br/>
例三、<br/>
$model->delete('name=?', 'tommy');</div>
<h2>第三部分：面向对象的数据库操作函数</h2>

<div style="margin-left:20px;">1、<strong>fetchRow($where, $value = null)</strong><br/>
根据参数的条件，对model所对应的数据表进行查询，并返回查询结果(对象型数据)。<br/>
参数说明：<br/>
$where为SQL的查询条件，参数格式等同于where()的参数。对它的理解，可以参考where()的使用。<br/>
$value为查询条件中?的替换数据，默认为null。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$data = $model->fetchRow('name=?', 'tommy');<br/>
或<br/>
$data = $model->fetchRow('name=\'tommy\'');<br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$data = $model->fetchRow('name=\'tommy\'');<br/>
$data->name = 'aspire'; <br/>
$data->save();<br/>
注：本例中本函数与save()函数组合使用，完成了对数据表信息的更改。将原来数据表中name为tommy的数据的name更改为aspire。save()函数的作用稍后将详细介绍。</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">2、<strong>save()</strong><br/>
将数据保存到model所对应的数据表里。有两个功能：当数据表原来有内容时，将内容更新的数据保存到数据表(相当于update)；当数据表没有相关数据内容时，则写入数据表(相当于insert)。注：本函数将所有的数组进行addslashes()转义，有效防止SQL注入。<br/>
参加说明：<br/>
参数为空</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$data = $model->fetchRow('name=\'tommy\'');<br/>
$data->name = 'aspire'; <br/>
$data->save();<br/>
注：本函数常与fetchRow()或createRow()之后使用。<br/>
<br/>
例二、<br/>
$data = $model->createRow();<br/>
$data->name = ''tommy;<br/>
$data->age = '23';<br/>
$data->country = 'china';<br/>
$data->save();<br/>
注：本函数与createRow()组合，完成一行数据的写入工作。$data->name = ''tommy;中name为数据表字段名，tommy为所要写入的数值。关于createRow()函数，马上就要讲述到。</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">3、<strong>createRow()</strong><br/>
建立内容为空的一行对象型数据。<br/>
参数说明：<br/>
参数为空</div>

<p>使用举例：</p>
<div style="margin-left:20px;">例一、<br/>
$data = $model->createRow();<br/>
$data->name = ''tommy;<br/>
$data->age = '23';<br/>
$data->country = 'china';<br/>
$data->save();</div>

<p>&nbsp;</p>
<h2>第四部分：事务处理操作</h2>

<div style="margin-left:20px;">1、<strong>startTrans()</strong><br/>
事务处理开始。<br/>
参数说明：<br/>
参数为空</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->startTrans();</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">2、<strong>commit()</strong><br/>
事务提交<br/>
参数说明：<br/>
参数为空</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->commit();</div>
<p>&nbsp;</p>
<div style="margin-left:20px;">3、<strong>rollback()</strong><br/>
事务回滚<br/>
参数说明：<br/>
参数为空</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$model->rollback();</div>
<h2>第五部分：其它</h2>

1、执行SQL语句

<div style="margin-left:20px;">(1)、<strong>execute($sql, $all_rows = true)</strong><br/>
执行一个SQL查询语句，并返回查询的数据。如果你认为前面那些对数据库进行操作的函数不够灵活，满足不了需要，这个函数至少弥补了这点不足。使用SQL语句操作数据表，灵活机动，随心所欲。<span>注：本函数只支持SQL的查询语句。</span>如果有inset, update, delete的语句，请用后面要介绍的函数：query()。<br/>
参数说明：<br/>
$sql为所要执行的SQL语句。注：参数只支持select的查询语句，其它的操作，函数会报错。<br/>
$all_rolws：返回的数据是否为全部数据，当为true时返回全部数据，当为false时，返回第一行数据，默认为true。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$sql = "select u.* from user as u, post as p where u.user_id=p.user_id and p.post_id&lt;15 order by p.post_id desc limit 0, 10";<br/>
$data = $model->execute($sql);<br/>
$this->dump($data);<br/>
<br/>
例二、<br/>
$sql = "select u.* from user as u, post as p where u.user_id=p.user_id and p.post_id&lt;15 order by p.post_id desc limit 0, 10";<br/>
$data = $model->execute($sql, false);<br/>
$this->dump($data);</div>

<p>&nbsp;</p>
<div style="margin-left:20px;">(2)、<strong>query($sql)</strong><br/>
执行一个SQL语句。执行成功返回true， 执行失败返回false。所以本函数比较适合执行insert, update, delete的语句。<br/>
参数说明：<br/>
$sql为所要执行的语句。注：参数虽支持select的SQL语句，但不能返回查询的数据，等于不支持。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$sql = "update post set title='tommy demo' where id=5";<br/>
$model->query($sql);</div>

<p>&nbsp;</p>
<div style="margin-left:20px;">3、<strong>get_insert_id()</strong><br/>
用于获取数据库执行写入操作时最后的ID。<br/>
参数说明：<br/>
参数为空。</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$insert_array = array('title'=>'DEMO', 'content'=>'IT IS A DEMO');<br/>
$model->insert($insert_array);<br/>
echo $model->get_insert_id();</div>

<p>&nbsp;</p>
<div style="margin-left:20px;">4、<strong>load_model($model_name)</strong><br/>
实例化model。类似于Controller基类中的函数model(),用于model文件中自定义业务逻辑时,对其它model进行实例化。<br/>
参数说明：<br/>
$model_name：model名称</div>

<p>使用举例：</p>

<div style="margin-left:20px;">例一、<br/>
$post_model = $this->model('post');<br/>
</div>
<p>&nbsp;</p>
<p>附：</p>
<p>1、<strong>定义数据表主键和字段信息</strong></p>
<div style="margin-left:20px;">在model文件自定义数据表字段信息。关于这一知识点，前面在介绍DoitPHP Tools时虽已讲过，这里再详细说明一下。 <br/>
<br/>
在model文件里重载函数：get_primary_key()和get_table_fields()来定义该model文件所对应的数据表的主键和字段信息。<br/>
如果model文件中没有重载这两个函数。则model运行过程序中用到数据表的主键和字段信息时，则会自动查询并把查询后的结果进行处理，最后把处理后的数据写入model的缓存文件中。以便下次再调用时，直接加载model缓存，不再查询等操作，从而提高程序运行效率。不过当页面访问量大时，这些model缓存反复的加载，磁盘的I/O读取操作频繁，对于运行效率来讲是个瓶颈。重载上面的两个函数，则省略了加载model的缓存文件，从而解决了这个磁盘I/O的问题，提高运行效率。</div>
<p>例一、</p>
<pre class="code">//定义数据表主键
protected function get_primary_key() {
        $this->primary_key = 'post_id';
        return true;
}</pre>
注：这里的主键支持多个主键，不过model在进行数据库操作时，则默认主键为第一个。其余主键忽略不计。所以这里定义主键时，当数据表有多个主键，最好定义第一个主键(最先出现的那个主键)。
<pre class="code">//定义数据表字段信息
protected function get_table_fields() {
        $this->table_field = array('post_id', 'post_name', 'post_desc');
        return true;
}</pre>
<p>&nbsp;</p>
<p>2、<b>定义model文件所对应的数据表名</b><br/>
  <br/>
从DoitPHP的命名规则上讲model文件所对应的数据表名默认为model类的名称(当然不包括单词：‘model’),可有时候数据表事前建好,且不符DoitPHP的命名规则，这种情况下的解决办法就是：自定义数据表名。方法就是在model文件重载(重定义)函数：get_table_name()。如：</p>
<pre class="code">
//定义对应的数据表名
protected function get_table_name() {
        $this->table_name = 'Product';
        return true;
}</pre>
<p>&nbsp;</p>
<p>3、<b>如何在controller中定义数据表主键</b><br/>
  <br/>
定义数据表主键除上面重载get_primary_key()函数之外，还有一种方法就是在controller中定义。举例如下：</p>
<pre class="code">
$model = $this->model('post');
//定义数据表主键
$model->primary_key = 'post_id';

$data = $model->find(23);</pre>
</div>
<!-- /文字说明 -->
</div>
<!-- /content -->
<div class="pagelist">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="35%" height="30" align="left">&nbsp;<a href="2.1.html" target="_self">上一页</a></td>
    <td width="30%" height="30" align="center"><a href="index.html" target="_self">返回目录</a></td>
    <td width="35%" align="right"><a href="2.3.html" target="_self">下一页</a>&nbsp;</td>
  </tr>
</table>
</div>
<div class="bottom">copyright <a href="http://www.doitphp.com" target="_blank">www.doitphp.com</a></div>
</div>
</body>
</html>